package event

import (
	"sync"
)

// 对外可用的全局事件总线
const GlobalEventBusName = "global"

var (
	// globalInstance 默认事件总线
	globalInstance EventBusIO
	globalOnce     sync.Once
)

func Global() EventBusIO {
	globalOnce.Do(func() {
		globalInstance = NewEventBus(GlobalEventBusName)
		globalInstance.(*eventBus).isGlobal = true // 设置为全局事件总线
	})
	return globalInstance
}

// Subscribe 异步方式订阅事件(长期订阅)
//   - eventName 事件名称
//   - eventHandler 回调函数
func Subscribe(eventName string, eventHandler EventHandler) error {
	return Global().Subscribe(eventName, eventHandler)
}

// SubscribeOnce 异步方式订阅事件(仅订阅一次)
//   - eventName 事件名称
//   - eventHandler 回调函数
func SubscribeOnce(eventName string, eventHandler EventHandler) error {
	return Global().SubscribeOnce(eventName, eventHandler)
}

// SubscribeSync 同步方式订阅事件(长期订阅)
//   - eventName 事件名称
//   - eventHandler 回调函数
func SubscribeSync(eventName string, eventHandler EventHandler) error {
	return Global().SubscribeSync(eventName, eventHandler)
}

// SubscribeSyncOnce 同步方式订阅事件(仅订阅一次)
//   - eventName 事件名称
//   - eventHandler 回调函数
func SubscribeSyncOnce(eventName string, eventHandler EventHandler) error {
	return Global().SubscribeSyncOnce(eventName, eventHandler)
}

// Unsubscribe 取消订阅事件
//   - eventName 事件名称
//   - eventHandler 回调函数(订阅事件时的同一个回调函数)
func Unsubscribe(eventName string, eventHandler EventHandler) error {
	return Global().Unsubscribe(eventName, eventHandler)
}

// Publish 发布事件, 触发事件广播
//   - eventName 事件名称
//   - data 事件参数 无参数时为nil
func Publish(eventName string, data EventData) error {
	return Global().Publish(eventName, data)
}

// Name 获取事件总线的名称
func Name() string {
	return Global().Name()
}

// GetEvents 获取事件总线的全部事件信息
func GetEvents() EventsInfo {
	return Global().GetEvents()
}

// State 获取EventBus的状态
func State() bool {
	return Global().State()
}

// Disabled 禁用EventBus
func Disabled() {
	Global().Disabled()
}

// Enabled 启用EventBus
func Enabled() {
	Global().Enabled()
}

// StateEvent 获取某一个事件的状态
//   - eventName 事件名称
func StateEvent(eventName string) bool {
	return Global().StateEvent(eventName)
}

// EventDisable 禁用某一个事件
//   - eventName 事件名称
func DisabledEvent(eventName string) error {
	return Global().DisabledEvent(eventName)
}

// EventEnabled 启用某一个事件
//   - eventName 事件名称
func EnabledEvent(eventName string) error {
	return Global().EnabledEvent(eventName)
}
